﻿// 中文注释：该文件定义了ChannelScene类，继承自QGraphicsScene，用于管理通道视图中的所有图形项和交互
#ifndef CHANNELSCENE_H
#define CHANNELSCENE_H

#include "ChannelCursorItem.h"
#include "ChannelTableItem.h"
#include <QGraphicsProxyWidget>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>

/**
 * @brief 通道场景类
 * 继承自QGraphicsScene，管理通道视图中的所有图形项和交互
 * 包含时间游标、通道表格部件和时间线等核心元素
 */
class ChannelScene : public QGraphicsScene
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数
     * @param parent 父对象指针
     * 初始化时间游标项、通道表格部件，设置拖动状态和游标边界初始值（100），
     * 并将游标添加到场景，启动50ms定时器（见ChannelScene.cpp实现）
     */
    explicit ChannelScene(QObject *parent = 0);

    /**
     * @brief 析构函数
     * 负责释放时间游标、通道表格部件等动态分配的资源
     */
    virtual ~ChannelScene();

    /**
     * @brief 重置场景矩形区域
     * @param rect 新的场景矩形范围（由ChannelView的resizeEvent调用）
     * 用于同步视图尺寸变化，调整场景显示范围
     */
    void resetRect(const QRectF &rect);

    /**
     * @brief 更新通道记录
     * @param num 需要更新的通道数量（由ChannelView::updateChannelRecord调用）
     * 触发通道表格部件的具体更新逻辑
     */
    void updateChannelRecord(int num);

    /**
     * @brief 定时器事件处理
     * @param event 定时器事件对象
     * 每50ms触发一次（由startTimer(50)启动），用于界面元素的定时更新
     */
    void timerEvent(QTimerEvent *event);

protected:
    /**
     * @brief 鼠标按下事件处理
     * @param event 鼠标事件对象
     * 处理时间游标或其他场景项的按下交互，可能设置m_isDragIng为true
     */
    void mousePressEvent(QGraphicsSceneMouseEvent *event);

    /**
     * @brief 鼠标移动事件处理
     * @param event 鼠标事件对象
     * 处理拖动逻辑（依赖m_isDragIng状态），限制时间游标在左右边界内移动
     */
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);

    /**
     * @brief 鼠标释放事件处理
     * @param event 鼠标事件对象
     * 结束拖动状态（设置m_isDragIng为false），完成交互操作
     */
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

private:
    ChannelCursorItem *m_timeCursor;       ///< 时间游标图形项（可拖动的时间标记，显示当前时间位置）
    ChannelTableItem *m_chWidget;          ///< 通道表格部件（显示通道数据的自定义控件，包含多个通道记录）
    QGraphicsProxyWidget *m_chProxyWidget; ///< 部件代理项（用于在QGraphicsScene中显示QWidget类型的控件）
    bool m_isDragIng;                      ///< 标记是否处于拖动状态（用于鼠标交互，true表示正在拖动时间游标）
    int m_timeCursorLeftBound;             ///< 时间游标左边界限制（初始值100，单位像素，限制游标不能超出此边界）
    int m_timeCursorRightBound;            ///< 时间游标右边界限制（初始值100，单位像素，限制游标不能超出此边界）
};

#endif // CHANNELSCENE_H
